﻿using System;
using System.Windows.Forms;
using SoftwareConsulting.BI11.Studio.BasicEntities;
using SoftwareConsulting.BI11.Studio.Core.Project;
using SoftwareConsulting.BI11.Studio.Core.Project.SituationsHierarchy;
using SoftwareConsulting.BI11.Studio.InternalServices;
using SoftwareConsulting.Interfaces.BasicEntities;
using SoftwareConsulting.BI11.Studio.UI.Properties;
using SoftwareConsulting.BI11.Studio.Core.Project.Metadata;

namespace SoftwareConsulting.BI11.Studio.UI.ProjectExplorer.SituationsHierarchy
{
    /// <summary>
    /// Диалог настройки/удаления ограничителя показателя
    /// </summary>
    public partial class IndicatorLimiterDialog : RestorableForm
    {
        private ProjectDescriptor _projectLink; //для связи с проектом
        private Characteristic _ch; //характеристика, на которую настраиваем ограничитель показателя
        private bool _isNewIndicatorLimiter=false; //флаг того, что ограничитель показателя новый
        private INamedHierarchy<Characteristic> _inheritingCharacteristics; //отредактированные понаследованные характеристики, в результате добавления нового ограничителя показателя

        /// <summary>
        /// Возвращает/устанавливает флаг нового ограничителя показателя
        /// </summary>
        public bool IsNewIndicatorLimiter
        {
            get
            {
                return _isNewIndicatorLimiter;
            }
            set
            {
                _isNewIndicatorLimiter = value;
            }
        }

        /// <summary>
        /// Возвращает связь с проектом
        /// </summary>
        public ProjectDescriptor ProjectLink
        {
            get
            {
                return _projectLink;
            }            
        }

        /// <summary>
        /// Инициализация компонентов
        /// </summary>
        public IndicatorLimiterDialog(ProjectDescriptor currentProject, Characteristic characteristic)
        {
            _projectLink = currentProject;
            _ch = characteristic;
            _inheritingCharacteristics = new NamedHierarchy<Characteristic>();
            InitializeComponent();            
        }

        /// <summary>
        /// Обновление данных о выбранных значениях
        /// </summary>
        private void UpdateItemsList()
        {
            ItemsListBox.Items.Clear();
            var ind = _ch.UsedIndicator;
            int c = ind.GetIndicatorValuesCount();
            IndicatorLimiter m = _ch.IndicatorLimiter;
            for (int i = 0; i < c; i++)
            {
                string s = "";
                var di = ind.GetIndicatorValueByPosition(i);
                object obj = di.Value;
                if (obj != null)
                {
                    if (Indicator.IsSituationType(ind.Type))
                    {
                        s = (obj as Situation).ToString();
                    }
                    else
                    {
                        s = obj.ToString();
                    }
                    ItemsListBox.Items.Add(s);
                    if ((m != null) && (m.HasItem(obj)))
                    {
                        ItemsListBox.SetItemChecked(ItemsListBox.Items.Count - 1, true);
                    }
                    if (_ch.ParentCharacteristicId != Guid.Empty)
                    {
                        Characteristic parcharacteristic = _ch.OwningSituation.IsA.GetItemById(_ch.ParentCharacteristicId);
                        if ((parcharacteristic.IndicatorLimiter != null) && (!parcharacteristic.IndicatorLimiter.HasItem(obj)))
                        {
                            ItemsListBox.Items[ItemsListBox.Items.Count - 1] = ItemsListBox.Items[ItemsListBox.Items.Count - 1] + " <(недоступно)>";
                        }
                    }
                }
            }      
            c = m.ValuesCount();            
            if (c==1)
            {
                int cc = ItemsListBox.Items.Count;
                IsNewIndicatorLimiter = true;
                for (int i = 0; i < cc; i++)
                {                    
                    ItemsListBox.SetItemChecked(i, true);                                        
                }
                IsNewIndicatorLimiter = false;                
                foreach(Characteristic ch in _inheritingCharacteristics)
                {
                    ch.IsInIndicatorLimiterInheritingProcess = false;
                }
            }
        }

        /// <summary>
        /// Добавляет/убирает значение в ограничителе показателя
        /// </summary>
        /// <param name="index"></param>
        /// <param name="checkState"></param>
        private bool UpdateItem(int index, CheckState checkState)
        {
            if (checkState == CheckState.Checked)
            {
                try
                {
                    _inheritingCharacteristics = _ch.IndicatorLimiter.IncludeItemToIndicatorLimiter(_ch.UsedIndicator.GetIndicatorValueByPosition(index + 1).Value, true, IsNewIndicatorLimiter);
                }
                catch (BISituationsHierarchyIndicatorLimiterCantBeExtendedException ex)
                {
                    GeneralMethods.ShowUserError(ex.Message);
                    return false;
                }
            }
            else
            {
                if (_ch.IndicatorLimiter.ValuesCount() > 2) //1е значение - null, еще хотя бы одно должно остаться включенным
                {
                    try
                    {
                        _ch.IndicatorLimiter.ExcludeItemFromIndicatorLimiter(_ch.UsedIndicator.GetIndicatorValueByPosition(index + 1).Value, true);
                    }
                    catch (BISituationsHierarchyIndicatorLimiterCantBeNarrowedException ex)
                    {
                        GeneralMethods.ShowUserError(ex.Message);
                        return false;
                    }
                }
                else
                {
                    GeneralMethods.ShowUserError(Resources.BI_SITUATIONSHIERARCHY_INDICATORLIMITER_ERROR_HASONEVALUE);                    
                    return false;
                }
            }
            return true;
        }

        private void ValuesLimiterDialog_Load(object sender, EventArgs e)
        {
            UpdateItemsList();
        }

        private void ItemsListBox_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            if (!UpdateItem(e.Index, e.NewValue))
            {
                e.NewValue = e.CurrentValue;
            }
        }

        private void OKButton_Click(object sender, EventArgs e)
        {

        }

        private void DelButton_Click(object sender, EventArgs e)
        {

        }
    }
}
